package com.zhu.rtda;

import com.zhu.rtda.heap.Method;

/**
 * Frame 表示 JVM 虚拟机中的一个栈帧（Stack Frame）。
 * <p>
 * 每个方法调用都会创建一个新的栈帧，用于存储：
 * - 局部变量表（Local Variables）
 * - 操作数栈（Operand Stack）
 * - 指向所属线程的引用
 * - 当前执行的方法
 * - 下一条指令地址（nextPC）
 * </p>
 * <p>
 * 栈帧在 Java 虚拟机栈中以链表形式组织，通过 {@link #lower} 指针连接。
 * </p>
 */
public class Frame {

    // region --- 字段 ---

    /** 指向前一个栈帧（形成调用栈链表） */
    private Frame lower;

    /** 局部变量表 */
    private LocalVars localVars;

    /** 操作数栈 */
    private OperandStack operandStack;

    /** 所属线程 */
    private Thread thread;

    /** 当前执行的方法 */
    private Method method;

    /** 下一条要执行的指令地址（在字节码中的偏移量） */
    private int nextPC;

    // endregion

    // region --- 构造函数 ---

    /**
     * 创建一个新的栈帧。
     *
     * @param thread 当前线程
     * @param method 当前执行的方法
     */
    public Frame(Thread thread, Method method) {
        this.thread = thread;
        this.method = method;
        this.localVars = new LocalVars(method.getMaxLocals());
        this.operandStack = new OperandStack(method.getMaxStack());
    }

    // endregion

    // region --- Getter 方法 ---

    public Frame getLower() {
        return lower;
    }

    public void setLower(Frame lower) {
        this.lower = lower;
    }

    public LocalVars getLocalVars() {
        return localVars;
    }

    public OperandStack getOperandStack() {
        return operandStack;
    }

    public Thread getThread() {
        return thread;
    }

    public Method getMethod() {
        return method;
    }

    public int getNextPC() {
        return nextPC;
    }

    public void setNextPC(int nextPC) {
        this.nextPC = nextPC;
    }

    // endregion
}